import tkinter as tk
# 导入 filedialog 模块
from tkinter import filedialog, ttk

import pandas as pd


class SelectExcelFileSheet:

    def __init__(self, parent):
        self.parent = parent
        self.window_width = 900
        self.window_height = 700
        self.screen_width = self.parent.winfo_screenwidth()
        self.screen_height = self.parent.winfo_screenheight()
        self.x = (self.screen_width - self.window_width) // 2
        self.y = (self.screen_height - self.window_height) // 2
        self.currentWindow = None

        self.frame1: tk.Frame = None
        self.label4ExcelPath: tk.Label = None
        self.entry4ExcelPath: tk.Entry = None
        self.btn4ExcelPath: tk.Button = None

        self.frame2: tk.Frame = None
        self.label4Sheet: tk.Label = None
        self.sheet_combobox: ttk.Combobox = None

        self.frame3: tk.Frame = None
        self.btn4Confirm: tk.Button = None

        self.selected_excel_filepath = None
        self.selected_sheet_name = None

    def select_excel_file(self):
        # 打开文件选择对话框，只显示 Excel 文件
        self.currentWindow.focus_force()
        file_path = filedialog.askopenfilename(
            title="选择 Excel 文件",
            filetypes=[("Excel files", "*.xlsx *.xls"), ("All files", "*.*")]
        )
        # 检查用户是否选择了文件
        if file_path:
            self.entry4ExcelPath.delete(0, tk.END)
            self.entry4ExcelPath.insert(0, file_path)
            self.selected_excel_filepath = file_path
            # 读取 Excel 文件的 sheet 名称
            try:
                excel_sheets = pd.ExcelFile(file_path).sheet_names
                self.sheet_combobox['values'] = excel_sheets
                self.sheet_combobox.current(0)  # 设置默认选中第一个选项
            except Exception as e:
                print(f"读取文件失败: {e}")
        self.currentWindow.lift()

        # 定义事件处理函数
    def on_combobox_select(self, event):
            selected_sheet = self.sheet_combobox.get()
            self.selected_sheet_name  = selected_sheet
    def on_btn4Confirm_click(self):
        selected_sheet = self.sheet_combobox.get()
        self.selected_sheet_name = selected_sheet
        self.currentWindow.destroy()
    def showWindow(self, title):
        self.currentWindow = tk.Toplevel(self.parent)
        self.currentWindow.title(title)
        self.currentWindow.geometry(f"{self.window_width}x{self.window_height}+{self.x}+{self.y}")
        self.currentWindow.transient(self.parent)
        # 设置新窗口获得焦点
        self.currentWindow.grab_set()
        # 将新窗口提升到最顶层
        self.currentWindow.lift()
        # 创建第一个框架，用于放置第一行的控件
        self.frame1 = tk.Frame(self.currentWindow)
        self.frame1.pack(fill=tk.X, padx=10, pady=10)
        # 在第一个框架中创建两个控件（按钮）

        self.label4ExcelPath = tk.Label(self.frame1, text=title+"路径:")
        self.label4ExcelPath.pack(side=tk.LEFT, padx=10, pady=10)

        self.entry4ExcelPath = tk.Entry(self.frame1, text="选择的Excel文件路径:")
        self.entry4ExcelPath.pack(side=tk.LEFT, padx=10, pady=10)
        self.entry4ExcelPath.delete(0, tk.END)

        self.btn4ExcelPath = tk.Button(self.frame1, text="选择"+title+"文件", command=self.select_excel_file)
        self.btn4ExcelPath.pack(side=tk.LEFT, padx=10, pady=10)

        # 创建第二个框架，用于放置第二行的控件
        self.frame2 = tk.Frame(self.currentWindow)
        self.frame2.pack(fill=tk.X, padx=10, pady=10)
        # 在第二个框架中创建两个控件（标签）
        self.label4Sheet = tk.Label(self.frame2, text="选择"+title+"sheet")
        self.label4Sheet.pack(side=tk.LEFT, padx=10, pady=10)

        # 创建下拉框
        self.sheet_combobox = ttk.Combobox(self.frame2)
        self.sheet_combobox.pack(side=tk.LEFT, padx=10, pady=10)

        # 绑定 <<ComboboxSelected>> 事件
        self.sheet_combobox.bind("<<ComboboxSelected>>", self.on_combobox_select)

        # 创建第一个框架，用于放置第一行的控件
        self.frame3 = tk.Frame(self.currentWindow)
        self.frame3.pack(fill=tk.X, padx=10, pady=10)
        self.btn4Confirm = tk.Button(self.frame3, text="确定", command=self.on_btn4Confirm_click)
        self.btn4Confirm.pack(side=tk.LEFT, padx=10, pady=10)
        # 在第一个框架中创建两个控件（按钮）
        self.parent.wait_window(self.currentWindow)
        return self.selected_excel_filepath,self.selected_sheet_name


